#include "ClientSocket.h"
#include "SocketException.h"
#include "structures.h"

#include <iostream>
#include <string>

using namespace std;

/*


L'utilisation d'un objet ostringstream permet de convertir un entier en une string :

#include <sstream>

int main()
{    
    // créer un flux de sortie
    ostringstream oss;
    // écrire un nombre dans le flux
    oss << 10;
    // récupérer une chaîne de caractères
    string result = oss.str();
}

Et l'inverse

#include <sstream>

int main()
{
    // créer un flux à partir de la chaîne à convertir
	istringstream iss( "10" );
    // convertir en un int
    int nombre;
    iss >> nombre; // nombre vaut 10
}



*/
int menuLogin(ClientSocket &client_socket, string* login, string* mdp);

int main ( int argc, char* argv[] ){

bool boucle=true;
int choix, res;
string login="Inconnu (pas encore logué)", mdp;
string reply="";

int* tabMem;

memPetS mem;



cout << "  .-.     .-.     .-.            .-.     .-.     .-. \n";
cout << ".'   `._.'   `._.'   `. CLIENT .'   `._.'   `._.'   `._ \n\n";

try{
		
 	ClientSocket client_socket ("localhost", 30001);
//   	ClientSocket* pt_sock = new ClientSocket("localhost", 30000);

	
/*
	try{
		
		client_socket << "Gordon Freeman";
		client_socket >> reply;
	
	}catch ( SocketException& e ){
		cout << "Exception was caught:" << e.description() << "\n";
   	}

	cout << "Message reçu de la part du serveur: \n\"" << reply << "\"\n";
*/	
while(boucle){
	cout<<endl<<endl<<"Entrez le numéro de votre choix:"<<endl<<endl;


	cout<<"----- Bienvenue sur Wikipediatre -----"<<endl;
	cout<<"1. Connexion"<<endl;
	cout<<"2. Je me connecte pour la premiere fois"<<endl;
	cout<<"3. En 3, euh, en 3, revendications (marche pas avec fonction)"<<endl;
	cout<<"4. Memoire partagée"<<endl;
	cout<<"0. Quitter"<<endl;

	//client_socket >> reply;
	//cout << reply <<endl;
	cin>>choix;

	
switch(choix){
	case 0:
		client_socket << 0;
		client_socket >> reply;
		client_socket << login;
		cout << "Info de deconnexion envoyées au serveur" << endl;
		cout<<"Bye bye"<<endl;
		boucle=false;
	break;
	case 3:
		client_socket << 1;
		client_socket >> reply;
		
		res=menuLogin(client_socket, &login, &mdp);
		if(res==-1){
			cout << "Vous n'avez pas de compte ou vous avez fait une erreur en vous connectant" << endl;
		}
	break;
	case 2:
		client_socket << 2;
		client_socket >> reply;
		
		//cout << reply <<endl;
		client_socket << 8;
	break;
	case 1:
		client_socket << 1;
		client_socket >> reply;
		
		cout<<"----- Module de connexion BIS -----"<<endl;
		
		cout << "Login : "; 
  		cin >> login;
  	
 	 	//getline(cin,*login);
		client_socket << login;		
		//client_socket >> reply;
	
		cout << "Mot de passe : "; 
	  	//getline(cin,*mdp);
	  	cin >> mdp;
		client_socket << mdp;		
	
		client_socket >> res;
		//client_socket << "ok";
	
		cout << "Reponse de connexion : " << res << endl;
		
	break;
	case 4://Memoire partagee
		client_socket << 4;
		client_socket >> reply;
	
		client_socket >> mem.idMP;
		cout << "ID de la MP : " << mem.idMP << endl;
		
		//Recuperation du pointeur dans la memoire partagée
		tabMem =(int*)shmat(mem.idMP,NULL,0);
		cout << "Tab[0] = " << tabMem[0]<<endl;
		tabMem[0]=8;
	break;
	default:
		cout<<"Mauvaise entrée, try again!"<<endl;
	break;
}
}

}catch ( SocketException& e ){
	cout << "Exception was caught:" << e.description() << "\n";
}

return 0;
}


int menuLogin(ClientSocket &client_socket, string* login, string* mdp){

	int res;
	string reply="";

	cout<<"----- Module de connexion -----"<<endl;
		
	cout << "Login : "; 
  	cin >> *login;
  	
  	//getline(cin,*login);
  	client_socket << *login;		
	//client_socket >> reply;
	
	cout << "Mot de passe : "; 
  	//getline(cin,*mdp);
  	cin >> *mdp;
	client_socket << *mdp;		
	
	client_socket >> res;
	//client_socket << "ok";
	
	cout << "Reponse de connexion : " << res << endl;
	
	return res;
}

